print("------------------8.4 传递列表--------------------")
# 向函数传递列表很有用，可能是名字列表、数值列表或更复杂的对象列表（如字典）
# 将列表传递给函数后，函数就能直接访问其内容。

# 接收列表
def greet_users(names):
    """向列表中的每位用户都发出简单的问候"""
    for name in names:
        msg = "Hello, " + name.title() + "!"
        print(msg)

usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)

print("------------------8.4.1 在函数中修改列表--------------------")
# 在函数中对这个列表所做的任何修改都是永久

# 首先创建一个列表，其中包含一些要打印的设计
unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []

# 模拟打印每个设计，直到没有未打印的设计为止
# 打印每个设计后，都将其移到列表completed_models中
while unprinted_designs:
    current_design = unprinted_designs.pop()
    # 模拟根据设计制作3D打印模型的过程
    print("Printing model: " + current_design)
    completed_models.append(current_design)
# 显示打印好的所有模型
print("\nThe following models have been printed:")
for completed_model in completed_models:
    print(completed_model)

print("------------------8.4.1 使用函数重新组织代码--------------------")
# 第一个函数负责处理打印设计的工作
def print_models(unprinted_designs, completed_models):
    """
    模拟打印每个设计，直到没有未打印的设计为止
    打印每个设计后，都将其移到列表completed_models中
    """
    while unprinted_designs:
        current_design = unprinted_designs.pop()
        # 模拟根据设计制作3D打印模型的过程
        print("Printing model: " + current_design)
        completed_models.append(current_design)
    # 方法内调用函数
    # show_completed_models(completed_models)

# 第二个函数显示打印好的所有模型
def show_completed_models(completed_models):
    """显示打印好的所有模型"""
    print("\nThe following models have been printed:")
    for completed_model in completed_models:
        print(completed_model)

unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []

# print_models(unprinted_designs, completed_models)
# show_completed_models(completed_models)

print("------------------8.4.3 禁止函数修改列表--------------------")
# 有时候，需要禁止函数修改列表。
# 可向函数传递列表的副本而不是原始列表，切片表示法 [:] 创建列表的副本。
# function_name(list_name[:])

# 传递列表副本，可保留原始列表的内容，同时还可避免函数修改列表。
print_models(unprinted_designs[:], completed_models)
show_completed_models(completed_models)
# 原始列表仍保留
print(unprinted_designs)


